package com.tjtt.tdm.base;

import java.io.Serializable;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.tjtt.tdm.base.PageResult;
import com.tjtt.tdm.exception.DaoException;

public interface EntityDAO<T> {
	
	public void setEntityClass(Class<T> t);
	/**
	 * 根据主键获取对象
	 * @param id 
	 * @return
	 * @throws DaoException
	 */
	public T get(Serializable id) throws DaoException;
	/**
	 * HQL语句，对象修改
	 * @param hql
	 * @param object
	 * @throws DaoException
	 */
	public void bulkUpdate(String hql, Object... object) throws DaoException;
	public void update(Object object) throws DaoException;
	/**
	 * 获取全部对象
	 * @return
	 * @throws DaoException
	 */
	public List<T> getAll() throws DaoException;
	
	/**
	 * 查询某种类型的所有的实体对象（不包含任何条件）
	 * @param entityClass
	 * @return
	 * @throws DaoException
	 */
	public List<T> getAll(Class<T> entityClass) throws DaoException;
	
	/**
	 * 分页获取对象集合
	 * @param start
	 * @param limit
	 * @param sort
	 * @param dir
	 * @return
	 * @throws DaoException
	 */
	public List<T> getList(Integer start, Integer limit, String sort, String dir) throws DaoException;
	/**
	 * 根据条件分页获取对象集合
	 * @param start
	 * @param limit
	 * @param sort
	 * @param dir
	 * @param wheresql
	 * @return
	 * @throws DaoException
	 */
	public List<T> getList(Integer start, Integer limit, String sort,
			String dir, String wheresql)throws DaoException;
	/**
	 * 根据条件获取对象集合
	 * @param wheresql
	 * @return
	 * @throws DaoException
	 */
	public List<T> getList(String wheresql)throws DaoException;
	/**
	 * 获取对象总数
	 * @return
	 * @throws DaoException
	 */
	public long getTotalCount()throws DaoException;
	/**
	 * 根据条件获取对象总数
	 * @param wheresql
	 * @return
	 * @throws DaoException
	 */
	public long getTotalCount(String wheresql) throws DaoException;
	/**
	 * 根据条件获取对象总数
	 * @param params
	 * @return
	 * @throws DaoException
	 */
	public long getTotalCount(HashMap params) throws DaoException;
	
	/**
	 * 根据sql语句统计当前数据的总数
	 * 
	 * @param params
	 * @param sql
	 * @return
	 */
	public long getTotalCountBySQL(HashMap params, String sql,String groupby) throws DaoException;
	
	/**
	 * 根据sql语句，查询当前数据库
	 * 
	 * @param start
	 * @param limit
	 * @param sort
	 * @param dir
	 * @param params
	 * @param sql
	 * @return
	 */
	public List findByPropertiesBySQL(long start, long limit,
			String sort, String dir, HashMap params, String sql, Class entity,boolean flagPage,String groupby) throws DaoException;
	/**
	 * 根据sql语句，查询当前数据库
	 * 
	 * @param start
	 * @param limit
	 * @param sort
	 * @param dir
	 * @param params
	 * @param sql
	 * @return
	 */
	public List findByPropertiesBySQLWithNullParam(long start, long limit,
			String sort, String dir, HashMap params, String sql, Class entity,boolean flagPage,String groupby) throws DaoException;
	
	/**
	 * 保存对象
	 * @param o
	 * @throws DaoException
	 */
	public String saveObject(Object o)throws DaoException;
	
	
	public void save(Object o)throws DaoException;
	/**
	 * 保存或修改对象
	 * @throws DaoException
	 */
	public void saveOrUpdate(Object o) throws DaoException;
	
	/**
	 * 保存多个对象
	 * @param coll
	 * @throws DaoException
	 */
	public void saveOrUpdateAll(Collection coll) throws DaoException;

	/**
	 * 删除对象
	 * @param o
	 * @throws DaoException
	 */
	public void remove(Object o)throws DaoException;

	/**
	 * 根据主键删除对象
	 * @param id
	 * @throws DaoException
	 */
	public void removeById(Serializable id)throws DaoException;
	/**
	 * 根据参数值删除对象
	 * @param paramName
	 * @param values
	 * @return
	 * @throws DaoException
	 */
	public int removeByParams(String paramName, Serializable[] values)throws DaoException;
	/**
	 * 根据参数删除指定的对象
	 * @param clazz
	 * @param paramName
	 * @param values
	 * @return
	 * @throws DaoException
	 */
	public int removeByParams(Class clazz, String paramName,Serializable[] values)throws DaoException;

	/**
	 * HQL查询
	 * 
	 * @param values
	 *            可变参数 用户可以如下四种方式使用 dao.find(hql) dao.find(hql,arg0);
	 *            dao.find(hql,arg0,arg1); dao.find(hql,new
	 *            Object[arg0,arg1,arg2])
	 */
	public List findByHql(String hql, Object... values)throws DaoException;

	/**
	 * 根据属性名和属性值查询对象.
	 * 
	 * @return 符合条件的对象列表
	 * 
	 * 
	 */
	public List<T> findByProperty(String name, Object... value)throws DaoException;

	/**
	 * 根据多个属性名和属性值查询对象.
	 * 
	 * @param filter
	 *            这是一个名--值对(name, value)
	 * @return 符合条件的对象列表 add by hhw 2006-12-15
	 */
	public List<T> findByProperties(String[] names, Object[] values)throws DaoException;

	/**
	 * 根据属性名和属性值查询对象.
	 * 
	 * @return 符合条件的唯一对象
	 */
	public T findUniqueByProperty(String name, Object value)throws DaoException;

	/**
	 * 根据多个属性名和属性值查询对象.
	 * 
	 * @param 参数存在hashMap中
	 * @return 符合条件的对象列表
	 */
	public List<T> findByProperties(HashMap params)throws DaoException;
	
	public List<T> findByProperties(HashMap params,String sort,String dir)throws DaoException;
	/**
	 * 根据多个参数集合分页查询对象
	 * @param start
	 * @param limit
	 * @param sort
	 * @param dir
	 * @param params
	 * @return
	 * @throws DaoException
	 */
	public List<T> findByProperties(long start, long limit, String sort,String dir, HashMap params)throws DaoException;
	/**
	 * sql语句,返回list集合中生成map
	 * @param sql
	 * @return
	 * @throws DaoException
	 */
	public List findBySQL(String sql) throws DaoException;
	/**
	 * sql语句,返回list集合中生成map
	 * @param sql
	 * @return
	 * @throws DaoException
	 */
	public List getBySQL(String sql)  throws DaoException;
	/**
	 * 动态执行sql语句
	 * @param sqlStr
	 * @return
	 * @throws DaoException
	 */
	public int executeSQL(final String sqlStr) throws DaoException;
	/**
	 * 动态执行seq
	 * @param seqName
	 * @return
	 * @throws DaoException
	 */
	public Long executeSeq(final String seqName) throws DaoException;
	
	
	public void merge(Object o) throws DaoException;
	/**
	 * 执行hql语句
	 * @param hql
	 * @return
	 * @throws DaoException List
	 * @author 李数
	 * @date 2012-8-27 上午11:34:38
	 */
	public List executeHql(String hql) throws DaoException ;
	
	/**
	 * 根据纯脆的SQL语句来查询
	 * PageResult
	 * 2011-5-11上午09:19:38
	 * author：李数
	 */
	public PageResult searchBySQL(String countsql,String querysql, Map filterMap) throws DaoException ;
	/**
	 * HQL 主要应用多表查询时的HQL查询
	 * PageResult
	 * 2011-5-11上午09:18:11
	 * author：李数
	 */
	public PageResult searchPaginated(String counthql,String queryhql, Map filterMap) throws DaoException;
	
	/**
	 * 根据HQL语句进行分页查询
	 * @param hql HQL语句
	 * @param params HQL语句带的多个参数值
	 * @param offset 从第几条记录开始查询
	 * @param pagesize 每页显示多少行
	 * @return
	 */
	public PageResult searchPaginated(String hql, Map filterMap) throws DaoException;
	/**
	 * 节点下是否有子节点存在
	 * @param paramMap
	 * @return long
	 * @author Zhanxm
	 * @date Sep 9, 2014 5:02:16 PM
	 */
	public long getCroleByRoleId(HashMap paramMap) throws DaoException;

}
